package user

import (
	"lao-a/controllers"
	"lao-a/models/model"
	"lao-a/models/user"
	"net/http"

	"github.com/astaxie/beego"
)

// UserController 用户
type UserController struct {
	dao *user.DAO
	controllers.BaseController
}

// Constructor 初始化 Controller
// @Title Constructor
// @Description 初始化 Controller, 系统自动调用
func (c *UserController) Constructor() {
	c.dao = user.NewDAO(c.Context)
}

// Login 用户登录
// @Title 用户登录
// @Description 用户登录
// @Param   Phone     form    string  true        "手机号"
// @Param   Passwd     form    string  true        "密码"
// @Success 200 model.SysUser 用户信息
// @Failure >300 error message
func (c *UserController) Login() {

	// 如果有 session 就算已经登录
	userId := c.GetSession(controllers.SESSION_USER)
	if userId != nil && c.Context.User != nil {
		// c.ResponseJson("用户已经登录!", http.StatusFound)
		user := c.Context.User.(*model.SysUser)
		c.SetSession(controllers.SESSION_USER, user.UserId)

		user.Passwd = ""
		c.ResponseJson(user)
	}

	var user model.SysUser
	// var token model.TaTokenSignin
	var err error

	tel := c.GetString("Phone")
	pass := c.GetString("Passwd")
	// useToken, _ := c.GetBool("useToken")
	// rememberMe, _ := c.GetBool("rememberMe")

	// if err = c.ParseForm(&token); err != nil {
	// 	if err != nil {
	// 		c.ResponseJson(
	// 			helper.LogError("接受登录信息失败", err),
	// 			http.StatusBadRequest,
	// 		)
	// 	}
	// }

	// 使用口令登录(记住我-功能)
	// if useToken {
	// 	if len(token.Token) == 0 {
	// 		c.ResponseJson("无上次登录口令, 请重新输入登录信息", http.StatusPreconditionFailed)
	// 	}

	// 	if len(token.ClientId) == 0 {
	// 		if len(tel) == 0 {
	// 			c.ResponseJson("无上次登录信息, 请重新输入登录信息", http.StatusPreconditionFailed)
	// 		}

	// 		token.ClientId = tel
	// 	}

	// 	user, err = c.dao.ValidUserToken(&token)
	// 	if err != nil {
	// 		c.ResponseJson("上次登录信息不正确, 请重新输入登录信息", http.StatusPreconditionFailed)
	// 	}

	// 	// 密码位为 secret
	// 	user.Passwd = token.Secret
	// } else {
	if len(tel) == 0 {
		c.ResponseJson("请填写手机号", http.StatusPreconditionFailed)
	}

	user, err = c.dao.ValidUserLogin(tel, pass)
	if err != nil {
		beego.Error("用户登录失败, ", err)
		c.ResponseJson("用户名或者密码不正确", http.StatusPreconditionFailed)
	}
	// 密码不能送到前端
	user.Passwd = ""

	// 保存登录信息
	// if rememberMe {
	// 	token.ExpireTime = time.Now().Add(7 * 24 * time.Hour)
	// 	token.ClientId = user.Phone
	// 	token.Secret = guid.NewGUIDString()

	// 	if len(token.Token) > 0 {
	// 		// 忽略错误
	// 		c.dao.SaveSignToken(&token)
	// 	}

	// 	// 密码位为 secret
	// 	user.Passwd = token.Secret
	// }
	// }

	if user.Status != 1 {
		c.ResponseJson("您的状态不对, 请联系相关人员", http.StatusPreconditionFailed)
	}

	c.SetSession(controllers.SESSION_USER, user.UserId)
	c.ResponseJson(user)
}

// SignUp 用户注册
// @Title 用户注册
// @Description用户注册
// @Param   Phone     form    string  true        "手机号"
// @Param   Captcha     form    string  true        "验证码"
// @Param   Passwd     form    string  true        "密码"
// @Param   UserName     form    string  true        "用户名"
// @Success 200 map[string]interface{} module配置信息
// @Failure >300 error message
// func (c *UserController) SignUp() {
// 	signInfo := struct {
// 		Phone    string
// 		Captcha  string
// 		Passwd   string
// 		UserName string
// 	}{}

// 	if err := c.ParseForm(&signInfo); err != nil {
// 		c.ResponseJson(
// 			helper.LogError("接受注册信息失败", err),
// 			http.StatusInternalServerError,
// 		)
// 	}

// 	// 校验手机号
// 	pn, err := c.dao.PhoneNum(signInfo.Phone)
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusBadRequest)
// 	}

// 	if pn != 0 {
// 		c.ResponseJson(
// 			"该手机号已经被注册, 请登录或者更换手机号码",
// 			http.StatusBadRequest,
// 		)
// 	}

// 	// 校验用户名
// 	if signInfo.UserName == "" {
// 		c.ResponseJson(
// 			"用户名不能为空",
// 			http.StatusBadRequest,
// 		)
// 	}

// 	// 校验手机验证码
// 	if !helper.CaptchaServer.Validate(signInfo.Phone, signInfo.Captcha) {
// 		c.ResponseJson(
// 			"手机验证码不正确或者已过期",
// 			http.StatusInternalServerError,
// 		)
// 	}

// 	// 校验密码
// 	if signInfo.Passwd == "" ||
// 		signInfo.Passwd == encrypt.Md5("") {
// 		c.ResponseJson(
// 			"用户密码不能为空",
// 			http.StatusBadRequest,
// 		)
// 	}

// 	userInfo := map[string]interface{}{
// 		"UserId":   guid.NewGUIDString(),
// 		"UserName": signInfo.UserName,
// 		"Passwd":   signInfo.Passwd,
// 		"Phone":    signInfo.Phone,
// 	}

// 	_, err = c.dao.SignUp(userInfo)
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusInternalServerError)
// 	}

// 	c.ResponseJson("ok")
// }

// GetUser 获取用户
// @Title 获取用户
// @Description 获取用户
// @Success 200 object model.SysUser
// @Failure >300 error message
func (c *UserController) GetUser() {
	user := c.Context.User.(*model.SysUser)
	c.ResponseJson(user)
}

// UpdateUser 修改用户信息
// @Title 修改用户信息
// @Description 修改用户信息
// @Param   UserName     form    string  true        "用户名"
// @Param   Avatar     form    string  true        "头像"
// @Success 200 string ok
// @Failure >300 error message
// func (c *UserController) UpdateUser() {
// 	avatar := c.GetString("Avatar")
// 	userName := c.GetString("UserName")

// 	user := c.Context.User.(*model.SysUser)
// 	user.Avatar = avatar
// 	user.UserName = userName

// 	updateCols := []string{
// 		"avatar",
// 		"user_name",
// 	}

// 	if err := c.dao.UpdateUserInfo(user, updateCols); err != nil {
// 		c.ResponseJson(err, http.StatusInternalServerError)
// 	}

// 	c.ResponseJson("ok")
// }

// GetCaptcha 获取验证码
// @Title 获取验证码
// @Description 获取验证码
// @Param   :phone     path    string  true        "手机号"
// @Success 200 object phone-and-captcha
// @Failure >300 error message
// func (c *UserController) GetCaptcha() {
// 	phone := c.GetString(":phone")
// 	// 校验手机号
// 	pn, err := c.dao.PhoneNum(phone)
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusBadRequest)
// 	}

// 	if pn != 0 {
// 		c.ResponseJson(
// 			"该手机号已经被注册, 请登录或者更换手机号码",
// 			http.StatusBadRequest,
// 		)
// 	}

// 	captcha, err := helper.CaptchaServer.Gen(phone)
// 	if err != nil {
// 		c.ResponseJson(
// 			helper.LogError("获取手机验证码失败", err),
// 			http.StatusInternalServerError,
// 		)
// 	}

// 	c.ResponseJson(map[string]interface{}{
// 		"Phone":   phone,
// 		"Captcha": captcha,
// 	})
// }

// ValidateCaptcha 校验验证码
// @Title 校验验证码
// @Description 校验验证码
// @Param   :phone     path    string  true        "手机号"
// @Param   :captcha     path    string  true        "验证码"
// @Success 200 string ok-string
// @Failure >300 error message
// func (c *UserController) ValidateCaptcha() {
// 	phone := c.GetString(":phone")
// 	captcha := c.GetString(":captcha")

// 	if !helper.CaptchaServer.Validate(phone, captcha) {
// 		c.ResponseJson(
// 			"手机验证码不正确或者已过期",
// 			http.StatusInternalServerError,
// 		)
// 	}

// 	c.ResponseJson("ok")
// }

// CheckPhone 验证手机号
// @Title 验证手机号
// @Description 验证手机号
// @Param   :phone     path    string  true        "手机号"
// @Success 200 string ok-string
// @Failure >300 error message
// func (c *UserController) CheckPhone() {
// 	phone := c.GetString(":phone")
// 	pn, err := c.dao.PhoneNum(phone)
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusBadRequest)
// 	}

// 	if pn != 0 {
// 		c.ResponseJson(
// 			helper.LogError("该手机号已经被注册, 请登录或者更换手机号码"),
// 			http.StatusBadRequest,
// 		)
// 	}

// 	c.ResponseJson("ok")
// }

// UpdateAvatar 更新用户头像
// @Title 更新用户头像
// @Description 更新用户头像
// @Param   Avatar     form    file  true        "头像文件"
// @Success 200 string ok-string
// @Failure >300 error message
// func (c *UserController) UpdateAvatar() {
// 	userId := c.Context.User.(*model.SysUser).UserId
// 	avatar, err := c.UploadFileToAliOSS("Avatar")
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusInternalServerError)
// 	}

// 	if err = c.dao.UpdateAvatar(userId, avatar); err != nil {
// 		c.ResponseJson(err, http.StatusInternalServerError)
// 	}

// 	c.ResponseJson(map[string]interface{}{
// 		"Avatar": avatar,
// 	})
// }

// UpdatePassword 更新用户密码
// @Title 更新用户密码
// @Description 更新用户密码
// @Param   oriPasswd     form    string  true        "旧密码"
// @Param   newPasswd     form    string  true        "新密码"
// @Success 200 string ok-string
// @Failure >300 error message
func (c *UserController) UpdatePassword() {
	oriPasswd := c.GetString("oriPasswd")
	newPasswd := c.GetString("newPasswd")

	user := c.Context.User.(*model.SysUser)
	if !c.dao.ValidatePassword(user, oriPasswd) {
		c.ResponseJson("原始密码不正确", http.StatusBadRequest)
	}

	if err := c.dao.UpdatePassword(user.UserId, newPasswd); err != nil {
		c.ResponseJson(err, http.StatusInternalServerError)
	}

	c.ResponseJson("ok")
}

// ResetPassword 短信找回密码
// @Title 短信找回密码
// @Description 短信找回密码
// @Param   Phone     form    string  true        "手机号"
// @Param   Captcha     form    string  true        "验证码"
// @Param   newPasswd     form    string  true        "新密码"
// @Success 200 string ok-string
// @Failure >300 error message
// func (c *UserController) ResetPassword() {
// 	phone := c.GetString("Phone")
// 	captcha := c.GetString("Captcha")
// 	newPasswd := c.GetString("newPasswd")

// 	user, err := c.dao.GetUserByPhone(phone)
// 	if err != nil {
// 		c.ResponseJson(err, http.StatusBadRequest)
// 	}

// 	nilPasswrodEncrptedByMd5 := "d41d8cd98f00b204e9800998ecf8427e"
// 	if newPasswd == "" || newPasswd == nilPasswrodEncrptedByMd5 {
// 		c.ResponseJson(
// 			"新密码不能为空",
// 			http.StatusBadRequest,
// 		)
// 	}

// 	if !helper.CaptchaServer.Validate(phone, captcha) {
// 		c.ResponseJson(
// 			"手机验证码不正确或者已过期",
// 			http.StatusInternalServerError,
// 		)
// 	}

// 	if err := c.dao.UpdatePassword(user.UserId, newPasswd); err != nil {
// 		c.ResponseJson(err, http.StatusInternalServerError)
// 	}

// 	c.ResponseJson("ok")
// }

// SignOut 登出
// @Title 登出
// @Description 登出
// @Success 200 string ok-string
// @Failure >300 error message
func (c *UserController) SignOut() {
	c.Context.User = nil
	c.DestroySession()

	c.ResponseJson("ok")
}
